aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/pages/[hash].js
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/pages/[hash].js')
-rw-r--r--frontend/src/pages/[hash].js81
1 files changed, 81 insertions, 0 deletions
diff --git a/frontend/src/pages/[hash].js b/frontend/src/pages/[hash].js
new file mode 100644
index 0000000..f281621
--- /dev/null
+++ b/frontend/src/pages/[hash].js
@@ -0,0 +1,81 @@
+import React, { useEffect, useState } from 'react';
+import { Text } from '../components/Inputs';
+import CodeRenderer from '../components/renderers/Code'
+import PasteInfo from '../components/PasteInfo';
+import PasswordModal from '../components/modals/PasswordModal'
+import RenderDispatch from '../components/renderers/RenderDispatch'
+import {Watermark} from "../components/Watermark";
+import { useRouter } from 'next/router'
+import resolvePaste from "../http/resolvePaste";
+import NextHead from "../components/NextHead";
+
+export async function getServerSideProps(ctx) {
+ const data = await resolvePaste(ctx.params.hash)
+ return { props: { ...data } }
+}
+
+const ViewPaste = ({data, unauthorized, error}) => {
+ const router = useRouter()
+ const { hash } = router.query
+ const [theme, setTheme] = useState('atom');
+ const [isRenderMode, setIsRenderMode] = useState(false);
+ const [enteredPass, setEnteredPass] = useState('');
+ const [correctPass, setCorrectPass] = useState(!unauthorized);
+ const [clientData, setClientData] = useState(data)
+ const {content, language, expiry, title} = clientData;
+
+ const getWithPassword = (password, errorCallback) => {
+ resolvePaste(hash, password)
+ .then(resp => {
+ setCorrectPass(true)
+ setClientData(resp.data)
+ })
+ .catch(e => errorCallback(e.response.data))
+ }
+
+ useEffect(() => {
+ setIsRenderMode(language === 'latex' || language === 'markdown')
+ }, [language])
+
+ function getDisplay() {
+ return isRenderMode ? <RenderDispatch
+ language={language}
+ content={content}
+ /> : <CodeRenderer
+ content={content}
+ lang={language}
+ theme={theme}
+ id="pasteInput" />
+ }
+
+ return (
+ <div>
+ {!error && <NextHead data={data} />}
+ <PasswordModal
+ hasPass={unauthorized}
+ validPass={correctPass}
+ value={enteredPass}
+ onChange={(e) => setEnteredPass(e.target.value)}
+ validateCallback={getWithPassword} />
+ <Text
+ label="title"
+ value={title}
+ id="titleInput"
+ readOnly />
+ {getDisplay()}
+ <PasteInfo
+ hash={hash}
+ lang={language}
+ theme={theme}
+ expiry={expiry}
+ toggleRenderCallback={() => setIsRenderMode(!isRenderMode)}
+ isRenderMode={isRenderMode}
+ onChange={(e) => setTheme(e.target.value)}
+ err={unauthorized ? '' : error}
+ />
+ <Watermark/>
+ </div>
+ );
+}
+
+export default ViewPaste \ No newline at end of file